package factory.abstract_factory;

/**
 * 抽象工厂模式:
 * 工厂方法的升级, 一个工厂方法只能生产一种产品, 抽象工厂可以生产多种
 *
 * 缺点: 拓展新产品困难, 需要修改具体工厂类
 *
 * 实现:
 * 1. 抽象工厂 & 具体实现
 * 2. 抽象产品 & 具体实现
 *
 * 有一定的开闭原则倾斜性:
 * 1.当增加一个新工厂时只需增加新具体工厂, 不需要修改原代码, 满足开闭原则
 * 2.当需要增加一个新产品时, 则所有的工厂类都需要进行修改, 不满足开闭原则
 * 
 * @author insight 
 * @since 2021/4/22
 */
public class AbstractFactory {
    public static void main(String[] args) {
        System.out.println("小米系列产品:");
        // 获取小米工厂
        XiaomiProductFactory xiaomiProductFactory = new XiaomiProductFactory();
        // 获取小米手机
        Phone xiaomiPhone = xiaomiProductFactory.producePhone();
        xiaomiPhone.callUp();
        xiaomiPhone.sendSMS();
        // 获取小米路由
        Router xiaomiRouter = xiaomiProductFactory.produceRouter();
        xiaomiRouter.openWifi();
        xiaomiRouter.setting();

        System.out.println("华为系列产品:");
        // 获取小米工厂
        HuaWeiProductFactory huaweiProductFactory = new HuaWeiProductFactory();
        // 获取小米手机
        Phone huaweiPhone = huaweiProductFactory.producePhone();
        huaweiPhone.callUp();
        huaweiPhone.sendSMS();
        // 获取小米路由
        Router huaweiRouter = huaweiProductFactory.produceRouter();
        huaweiRouter.openWifi();
        huaweiRouter.setting();
    }
}